package com.fishleap.util;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.pool.DruidPooledConnection;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;

import java.sql.SQLException;
import java.util.Map;

/**
 * @author zlg
 * DruidUtils工具类
 */
@Component
public class DruidUtils {

    // 1. 初始化：需要定义 数据源 类
    private static DruidDataSource dataSource;  // DataSource没有close方法

//        {"url":"jdbc:mysql://localhost:3306/user","username":"root","password":"root"}
//        {"url":"jdbc:mysql://localhost:3306/user2","username":"root","password":"root"}

    public static synchronized void ininDatasource() {
        // 2.从zookeeper中获取 /mysql-config/dataBase 节点相关信息
        String path = "/database";
        String nodeData = CuratorUtils.getNodeData(path);
        Map infoMap = (Map) JSON.parse(nodeData);

        try {
            // 3.获取数据源
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(infoMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


//    static {



//        Database database = (Database)JSONObject.parse(nodeData);
        // 3.配置数据源信息
//        druidDataSource = new DruidDataSource();
//        druidDataSource.setUrl(database.getUrl());
//        druidDataSource.setUsername(database.getUsername());
//        druidDataSource.setPassword(database.getPassword());



        /*// 2. 读取配置文件
        // |-------------类名.class.获取类加载器.获取资源作为流("配置文件名的名称"); | jdbc.properties 是一个配置文件的类型 比较方便
        InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");

        // 3. 实例化Properties 类
        Properties p = new Properties();

        // 4. 通过props对象进行加载配置文件的输入流
        try {
            p.load(is);
            // 5. 通过DuridDataSource核心类的创建数据源方法进行 赋值给 dataSource
            dataSource = DruidDataSourceFactory.createDataSource(p);
        }catch (Exception e){
            throw new RuntimeException(e);
        }*/

//    }

    /**
     * 为什么有这个方法？
     *  |----答：因为我存在就是为了让其他类可以调用我的  谁调用我，我就跟谁说的数据
     */
    public static DruidDataSource getDataSource(){
        return dataSource;
    }

    public static void setDataSource(DruidDataSource druidDataSource) {
        dataSource = druidDataSource;
    }
    /**
     * 数据源获取连接的方法
     */
    public static DruidPooledConnection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}
